#include "widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    m_tc = new Teacher;
    m_st = new Student;

    //将信号与槽做了连接
    //Qt4中的写法，这是一种传统的写法，这种写法很简单，但是传递参数的时候
    //不做类型检查，将传递的参数转换为一个字符串即可,如果传递的参数不对，
    //也不会报错，所以这种方式存在缺陷
    //connect(m_tc, SIGNAL(treat()), m_st, SLOT(eat()));

    //connect没有接受者版本的方式中，槽函数可以使用lambda进行替代
//    connect(m_tc, &Teacher::treat, [](){
//        qDebug() << "哈哈哈";
//    });

    //当有函数重载的时候，可以显示的使用成员函数指针进行体现
//    void (Teacher::*ptcVoid)() = &Teacher::treat;
//    void (Student::*pstVoid)() = &Student::eat;
//    connect(m_tc, ptcVoid, m_st, pstVoid);

//    void (Teacher::*ptcArg)(QString) = &Teacher::treat;
//    void (Student::*pstArg)(QString) = &Student::eat;
//    connect(m_tc, ptcArg, m_st, pstArg);

    //针对于重载版本的时候，C++11的写法
//    connect(m_tc, QOverload<>::of(&Teacher::treat),
//            m_st, QOverload<>::of(&Student::eat));

//    connect(m_tc, QOverload<QString>::of(&Teacher::treat),
//            m_st, QOverload<QString>::of(&Student::eat));


    //针对于重载版本的时候，C++11的写法
//    connect(m_tc, qOverload<>(&Teacher::treat),
//            m_st, qOverload<>(&Student::eat));

//    connect(m_tc, qOverload<QString>(&Teacher::treat),
//            m_st, qOverload<QString>(&Student::eat));

//    connect(m_tc, qOverload<QString>(&Teacher::treat), [](){
//            qDebug() << "哈哈哈";
//        });


    classIsOver();
}

Widget::~Widget()
{
    delete m_tc;
    delete m_st;
}

void Widget::classIsOver()
{
    emit m_tc->treat();//触发信号
    emit m_tc->treat("满汉全席");//触发信号
}

